/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.siseventos.managed;

import br.siseventos.model.TbPublico;
import br.siseventos.model.TdTipoPublico;
import br.siseventos.service.PublicoService;
import br.siseventos.service.TipoPublicoService;
import br.siseventos.view.util.CallbackHelper;
import br.siseventos.view.util.MessageHelper;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

/**
 *
 * @author marcosnatanpacheco
 */
@ManagedBean(name = "publicoBean")
@ViewScoped
public class PublicoBean extends BaseBean{
    // Campos

    private TipoPublicoService tipoPublicoService; // Service
    private PublicoService publicoService; // DAO
    private String nome;
    private TdTipoPublico tipoPublicoSelecionado;
    private TbPublico publicoSelecionado;
    private List<TdTipoPublico> listaTiposPublico;
    private List<TbPublico> listaPublico;

    // Util
    // Construtor
    public PublicoBean() {
        // Inicializando as daos
        publicoService = new PublicoService();
        tipoPublicoService = new TipoPublicoService();

        // Populando o DataTable de Públicos e Menu de tipo de público
        popularDataTable();
        carregarMenuTipoPublico();


    }

    // Getters e Setters
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public TdTipoPublico getTipoPublicoSelecionado() {
        return tipoPublicoSelecionado;
    }

    public void setTipoPublicoSelecionado(TdTipoPublico tipoPublicoSelecionado) {
        this.tipoPublicoSelecionado = tipoPublicoSelecionado;
    }

    public TbPublico getPublicoSelecionado() {
        return publicoSelecionado;
    }

    public void setPublicoSelecionado(TbPublico publicoSelecionado) {
        this.publicoSelecionado = publicoSelecionado;
    }

    public List<TbPublico> getListaPublico() {
        return listaPublico;
    }

    public void setListaPublico(List<TbPublico> listaPublico) {
        this.listaPublico = listaPublico;
    }

    public List<TdTipoPublico> getListaTiposPublico() {
        return listaTiposPublico;
    }

    public void setListaTiposPublico(List<TdTipoPublico> listaTiposPublico) {
        this.listaTiposPublico = listaTiposPublico;
    }

    // Actions e listeners
    public void cadastrarPublico(ActionEvent ex) {
        try {
            // Criando o objeto Publico a ser cadastrado no banco
            TbPublico p = new TbPublico();
            p.setNmePublico(getNome());
            p.setTdTipoPublico(getTipoPublicoSelecionado());

            // Cadastrando no banco
            publicoService.incluir(p);

            // Carregar a lista de tipos publicos novamente
            popularDataTable();

            // Mostrando msg de sucesso!
            MessageHelper.showGlobalMessage("Público cadastrado com sucesso!", FacesMessage.SEVERITY_INFO);

            // Adicionando o parâmetro de Callback
            CallbackHelper.addCallback("salvo", true);


        } catch (Exception e) {
            MessageHelper.showGlobalMessage("Erro ao cadastrar público!", FacesMessage.SEVERITY_ERROR);
        }
    }

    public void excluirPublico(ActionEvent e) {
        FacesContext contexto = FacesContext.getCurrentInstance();

        try {
            // Excluindo o público selecionado
            publicoService.excluir(publicoSelecionado.getIdtPublico());

            // Carregar a lista de tipos publicos novamente
            popularDataTable();

            // Mostrando mensagem de sucesso
            MessageHelper.showGlobalMessage("Público excluído com sucesso!", FacesMessage.SEVERITY_INFO);

        } catch (Exception ex) {
            // Mostrando mensagem de erro
            MessageHelper.showGlobalMessage("Erro ao excluir público!", FacesMessage.SEVERITY_ERROR);
        }
    }

    public void alterarPublico(ActionEvent e) {
        try {
            // Alterando o público
            publicoService.alterar(publicoSelecionado);

            // Carregar a lista de tipos publicos novamente
            popularDataTable();

            // Mostrando mensagem de sucesso
            MessageHelper.showGlobalMessage("Publico alterado com sucesso!", FacesMessage.SEVERITY_INFO);

            // Adicionando o parâmetro de Callback
            CallbackHelper.addCallback("editado", true);

        } catch (Exception ex) {
            // Mostrando mensagem de erro
            MessageHelper.showGlobalMessage("Erro ao alterar público!", FacesMessage.SEVERITY_ERROR);
        }
    }

    // Converters e Utils
    

    private void popularDataTable() {
        try {
            // Carregando o datatable de publicos
            listaPublico = publicoService.consultarTodos();
        } catch (Exception ex) {
            MessageHelper.showGlobalMessage("Ocorreu um erro: " + ex.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
    }

    private void carregarMenuTipoPublico() {
        try {
            // Carregando o menu de tipos de público
            listaTiposPublico = tipoPublicoService.consultarTodos();
        } catch (Exception ex) {
        }
    }
}
